# IRIS数据 ， 决策树方法
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn import metrics
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt

### 加载数据集 #################################################################################
iris = load_iris()
x_data = iris.data
y_data = iris.target

np.random.seed(2022)  # 固定随机种子
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3)  # 随机抽取30%的测试集

### 建立决策树  ################################################################################
model = DecisionTreeClassifier(criterion="entropy")  # 采用信息熵 C4.5算法
model.fit(x_train, y_train)


# 画出 决策树 ################################################################################################
tree.plot_tree(model)
# 把树形结构输出到pdf
# !pip install graphviz
import graphviz
from sklearn import tree
dot_data = tree.export_graphviz(model, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("决策树") # 生成 '决策树.pdf'


### 输出结果  #############################################################################################
score = model.score(x_train, y_train)#输出训练误差
print(score)
score = model.score(x_test, y_test)#输出测试误差
print(score)

y_pred = model.predict(x_test)#预测
print(y_pred)

print('混淆矩阵：\n', confusion_matrix(y_test, y_pred))
report = metrics.classification_report(y_test, y_pred)##
print(report)

# ## 以文字结构输出 树形结构
# from sklearn.tree import export_text
# r = export_text(clf, feature_names=iris['feature_names'])
# print(r)

plt.show()
print('done')
